import router from '@/router'
import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
// Message.success('123')

// axios.create()  新建axios实例 => 用于发送请求

// process.env => 获取环境变量

// axios.defaults.baseURL = process.env.VUE_APP_BASE_API
// axios.defaults.baseURL = 'xxx'

const http = axios.create({
  // 配置请求的基地址
  // process.env.VUE_APP_BASE_API => 会根据环境自动读取对应的值 根据环境切换baseURL!!!
  // baseURL = 'http://localhost:8888/api'   '/api' => 如果没有完整的服务器地址, 就会自动补上
  baseURL: process.env.VUE_APP_BASE_API,
  // baseURL: 'http://www.liulongbin.top:7878',

  // 设置超时时间, 一旦超过5s, 响应结果就不要了
  timeout: 5000 // request timeout
})

// 请求 响应拦截器(占位)....

// 添加请求拦截器(请求之前经过)
http.interceptors.request.use(function(config) {
  // 在发送请求之前做些什么
  // ... 统一设置请求头

  const token = store.getters.token
  if (token) {
    // 如果登录过  有token 再去设置请求头
    config.headers.Authorization = `Bearer ${token}`
  }

  return config
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器(响应结果回到浏览器之前经过)
http.interceptors.response.use(function(response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 响应拦截器统一扒掉一层数据
  const res = response.data

  // 我们希望的是 : 请求成功(200)  且结果失败(success: false) => 这类请求 => 不走.then , 走.catch => 返回一个失败的promise
  // console.log(res, 9090)
  if (!res.success) {
    // 表示请求成功(200)  且结果失败(success: false)
    // this.$message
    // 统一的提示
    Message.error(res.message)

    // =>  返回一个立即失败的promise
    // return new Promise((resolve, reject) => {
    //   reject(new Error(res.message))
    // })
    // 写法和下面等价
    return Promise.reject(new Error(res.message))
  }

  // 对响应数据做点什么
  return res
}, function(error) {
  console.dir(error)
  if (error.response.status === 401 && error.response.data.code === 10002) {
    // 表示登录过期了 401未授权
    // 提示 清除token 清除个人信息 跳转
    Message.error('您的登录已过期, 请重新登录')
    store.dispatch('user/logout')
    router.push('/login')
  } else {
    Message.error(error.message)
  }
  // 超出 2xx 范围的状态码都会触发该函数。  500  400 401 404...
  // 对响应错误做点什么
  // 统一的提示  error 错误对象 => { message: 'xxx' }

  return Promise.reject(error)
})

export default http
